# Each segment here sums the first hundred million integers.
# We time the impact of using more and more processors.

import multiprocessing
import time

def sumNums(args):
    start, end = args
    sum = 0
    for i in range(start, end):
        sum = sum + i
    return sum

def main():
    N = 100000000  # one hundred million
    start = time.clock()
    total = sumNums((0, N))
    end = time.clock()
    print( "Sum is %d. One process took %.3f seconds." %(total, end-start) )

    start = time.clock()
    p = multiprocessing.Pool(processes = 2)
    results = p.map( sumNums, [(0, N//2), (N//2, N)])
    total = results[0] + results[1]
    end = time.clock()
    print( "Sum is %d. Two processes took %.3f seconds." %(total, end-start) )

    start = time.clock()
    p = multiprocessing.Pool(processes = 4)
    results = p.map( sumNums, [(0, N//4),(N//4, N//2), (N//2, 3*N//4), (3*N//4, N)])
    total = results[0] + results[1] + results[2] + results[3]
    end = time.clock()
    print( "Sum is %d. Four processes took %.3f seconds." %(total, end-start) )

    args = []
    begin = 0
    for i in range(0, 8):
        args.append( (begin, begin+N//8))
        begin = begin + N//8
    start = time.clock()
    p = multiprocessing.Pool(processes = 8)
    results = p.map( sumNums, args)
    total = 0
    for x in results:
        total = total + x
    end = time.clock()
    print( "Sum is %d. Eight processes took %.3f seconds." %(total, end-start) )
    
    args = []
    begin = 0
    for i in range(0, 100):
        args.append( (begin, begin+N//100))
        begin = begin + N//100
    start = time.clock()
    p = multiprocessing.Pool(processes = 100)
    results = p.map( sumNums, args)
    total = 0
    for x in results:
        total = total + x
    end = time.clock()
    print( "Sum is %d. One hundred processes took %.3f seconds." %(total, end-start) )

if __name__ == "__main__":
    main()
    input()
